home *** CD-ROM | disk | FTP | other *** search
/ Programming Windows 95 with MFC / Programming Windows 95 with MFC (Microsoft Programming Series)(097-0001465)(1996).iso / NT / CODE / CHAP12 / PALETTEDEMO / PALETTEDEMO.CPP next >
C/C++ Source or Header  |  1996-04-05  |  4KB  |  162 lines

  1. //***********************************************************************
  2. //
  3. //  PaletteDemo.cpp
  4. //
  5. //***********************************************************************
  6.  
  7. #include <afxwin.h>
  8. #include "PaletteDemo.h"
  9.  
  10. #define FONTHEIGHT 72
  11.  
  12. CMyApp myApp;
  13.  
  14. /////////////////////////////////////////////////////////////////////////
  15. // CMyApp member functions
  16.  
  17. BOOL CMyApp::InitInstance ()
  18. {
  19.     m_pMainWnd = new CMainWindow;
  20.     m_pMainWnd->ShowWindow (m_nCmdShow);
  21.     m_pMainWnd->UpdateWindow ();
  22.     return TRUE;
  23. }
  24.  
  25. /////////////////////////////////////////////////////////////////////////
  26. // CMainWindow message map and member functions
  27.  
  28. BEGIN_MESSAGE_MAP (CMainWindow, CFrameWnd)
  29.     ON_WM_CREATE ()
  30.     ON_WM_ERASEBKGND ()
  31.     ON_WM_PAINT ()
  32.     ON_WM_QUERYNEWPALETTE ()
  33.     ON_WM_PALETTECHANGED ()
  34. END_MESSAGE_MAP ()
  35.  
  36. CMainWindow::CMainWindow ()
  37. {
  38.     Create (NULL, "Palette Demo");
  39. }
  40.  
  41. int CMainWindow::OnCreate (LPCREATESTRUCT lpcs)
  42. {
  43.     if (CFrameWnd::OnCreate (lpcs) == -1)
  44.         return -1;
  45.  
  46.     CClientDC dc (this);
  47.     if (dc.GetDeviceCaps (RASTERCAPS) & RC_PALETTE) {
  48.         struct {
  49.             LOGPALETTE lp;
  50.             PALETTEENTRY ape[63];
  51.         } pal;
  52.  
  53.         LOGPALETTE* pLP = (LOGPALETTE*) &pal;
  54.         pLP->palVersion = 0x300;
  55.         pLP->palNumEntries = 64;
  56.  
  57.         for (int i=0; i<64; i++) {
  58.             pLP->palPalEntry[i].peRed = 0;
  59.             pLP->palPalEntry[i].peGreen = 0;
  60.             pLP->palPalEntry[i].peBlue = 255 - (i * 4);
  61.             pLP->palPalEntry[i].peFlags = 0;
  62.         }
  63.         m_palette.CreatePalette (pLP);
  64.     }
  65.     return 0;
  66. }
  67.  
  68. BOOL CMainWindow::OnEraseBkgnd (CDC* pDC)
  69. {
  70.     CRect rect;
  71.     GetClientRect (&rect);
  72.  
  73.     CPalette* pOldPalette;
  74.     if ((HPALETTE) m_palette != NULL) {
  75.         pOldPalette = pDC->SelectPalette (&m_palette, FALSE);
  76.         pDC->RealizePalette ();
  77.     }
  78.  
  79.     DoGradientFill (pDC, &rect);
  80.  
  81.     if ((HPALETTE) m_palette != NULL)
  82.         pDC->SelectPalette (pOldPalette, FALSE);
  83.     return TRUE;
  84. }
  85.  
  86. void CMainWindow::OnPaint ()
  87. {
  88.     CRect rect;
  89.     GetClientRect (&rect);
  90.  
  91.     CPaintDC dc (this);
  92.     DoDrawText (&dc, &rect);
  93. }
  94.  
  95. BOOL CMainWindow::OnQueryNewPalette ()
  96. {
  97.     if ((HPALETTE) m_palette == NULL)   // Shouldn't happen, but
  98.         return 0;                       // let's be sure
  99.  
  100.     CClientDC dc (this);
  101.     CPalette* pOldPalette = dc.SelectPalette (&m_palette, FALSE);
  102.  
  103.     UINT nCount;
  104.     if (nCount = dc.RealizePalette ())
  105.         Invalidate ();
  106.  
  107.     dc.SelectPalette (pOldPalette, FALSE);
  108.     return nCount;
  109. }
  110.  
  111. void CMainWindow::OnPaletteChanged (CWnd* pFocusWnd)
  112. {
  113.     if ((HPALETTE) m_palette == NULL)   // Shouldn't happen, but
  114.         return;                         // let's be sure
  115.  
  116.     if (pFocusWnd != this) {
  117.         CClientDC dc (this);
  118.         CPalette* pOldPalette = dc.SelectPalette (&m_palette, FALSE);
  119.         if (dc.RealizePalette ())
  120.             Invalidate ();
  121.         dc.SelectPalette (pOldPalette, FALSE);
  122.     }
  123. }
  124.  
  125. void CMainWindow::DoGradientFill (CDC* pDC, CRect* pRect)
  126. {
  127.     CBrush* pBrush[64];
  128.     for (int i=0; i<64; i++)
  129.         pBrush[i] = new CBrush (PALETTERGB (0, 0, 255 - (i * 4)));
  130.  
  131.     int nWidth = pRect->Width ();
  132.     int nHeight = pRect->Height ();
  133.     CRect rect;
  134.  
  135.     for (i=0; i<nHeight; i++) {
  136.         rect.SetRect (0, i, nWidth, i + 1);
  137.         pDC->FillRect (&rect, pBrush[(i * 63) / nHeight]);
  138.     }
  139.  
  140.     for (i=0; i<64; i++)
  141.         delete pBrush[i];
  142. }
  143.  
  144. void CMainWindow::DoDrawText (CDC* pDC, CRect* pRect)
  145. {
  146.     CFont font;
  147.     int nHeight = -((pDC->GetDeviceCaps (LOGPIXELSY) * FONTHEIGHT) / 72);
  148.  
  149.     font.CreateFont (nHeight, 0, 0, 0, FW_BOLD, TRUE, 0, 0,
  150.         DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS,
  151.         DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Times New Roman");
  152.  
  153.     pDC->SetBkMode (TRANSPARENT);
  154.     pDC->SetTextColor (RGB (255, 255, 255));
  155.  
  156.     CFont* pOldFont = pDC->SelectObject (&font);
  157.     pDC->DrawText ("Hello, MFC", -1, pRect, DT_SINGLELINE | DT_CENTER |
  158.         DT_VCENTER);
  159.  
  160.     pDC->SelectObject (pOldFont);
  161. }
  162.